package com.example.demo_flow

import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.flatMapConcat
import kotlinx.coroutines.flow.flatMapMerge
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.runBlocking
import java.util.concurrent.Flow

/**
 * @author yaotianxue
 * @description
 * @date 2025/1/9
flatMapConcat/flatMapMerge/flatMapLatest：处理接口串行关系，第一个接口得到的结果作为第二个接口的参数，避免回调地狱

 */
fun main() {

//    runBlocking {
//        sendGetTokenRequest()
//            .flatMapMerge { token->
//                sendGetUserInfoRequest(token)
//            }.flowOn(Dispatchers.IO)
//            .collectLatest {
//                println(it)
//            }
//    }
    runBlocking {
        flowOf(3000, 2000, 1000)
            .flatMapMerge {
                flow {
                    delay(it.toLong())
                    emit("a$it")
                    emit("b$it")
                }
            }
            .collect {
                println(it)
            }
    }
}

/**
 * 第一个接口获得token
 */
fun sendGetTokenRequest() = flow {
    emit("1234556")

}

/**
 * 第二个接口：根据token获得用户信息
 */
fun sendGetUserInfoRequest(token:String) = flow {
    emit(token+"用户信息")
}

